<?php

// 观察者模式
// 它是一种事件系统，意味着这一模式允许某个类观察
// 另一个类的状态，当被观察的类状态发生改变的时候，
// 观察类可以收到通知并且做出相应的动作；观察这模
// 式提供了避免组件之间紧密耦合的另一种方法

class Man
{
    // 用来存放观察者
    protected $observers = [];

    // 添加观察者
    function addObserver($observer)
    {
        $this->observers[] = $observer;
    }

    // 删除观察者
    function delObserver($observer)
    {
        // 查找对应值在数组中的键
        $key = array_search($observer, $this->observers);
        // 根据键删除值，并且数组重新索引
        array_splice($this->observers, $key, 1);
    }

    // 花钱方法
    function buy()
    {
        // 当被观察者做出这个行为的时候，让观察者得到通知，
        // 并且做出一定的反应
        foreach($this->observers as $girl) {
            $girl->dongjie();
        }
    }
}

class GirlFriend
{
    protected $name;

    function __construct($name)
    {
        $this->name = $name;    
    }

    function dongjie()
    {
        echo $this->name . '，你的男朋友正在花钱，马上冻结他的银行卡<br/>';
    }
}

// 测试
$xiaoming = new Man();
$xiaohong = new GirlFriend('小红');
$xiaohua = new GirlFriend('小花');
$xiaoming->addObserver($xiaohong);
$xiaoming->addObserver($xiaohua);

$xiaoming->buy();

$xiaoming->delObserver($xiaohua);
$xiaoming->buy();